home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / grafica / amhelios / win_sbar.cpp < prev    next >
C/C++ Source or Header  |  1999-01-01  |  4KB  |  149 lines

  1. ////////////////////////////////////////////////////////////
  2. //
  3. //  WIN_SBAR.CPP - MS-Windows Scroll Bar Control Class
  4. //
  5. //  Version:    1.03A
  6. //
  7. //  History:    94/08/23 - Version 1.00A release.
  8. //              94/12/16 - Version 1.01A release.
  9. //              95/02/05 - Version 1.02A release.
  10. //              95/07/21 - Version 1.02B release.
  11. //              96/02/14 - Version 1.02C release.
  12. //              96/04/01 - Version 1.03A release.
  13. //
  14. //  Compilers:  Microsoft Visual C/C++ Professional V1.5
  15. //              Borland C++ Version 4.5
  16. //
  17. //  Author:     Ian Ashdown, P.Eng.
  18. //              byHeart Software Limited
  19. //              620 Ballantree Road
  20. //              West Vancouver, B.C.
  21. //              Canada V7S 1W3
  22. //              Tel. (604) 922-6148
  23. //              Fax. (604) 987-7621
  24. //
  25. //  Copyright 1994-1996 byHeart Software Limited
  26. //
  27. //  The following source code has been derived from:
  28. //
  29. //    Ashdown, I. 1994. Radiosity: A Programmer's
  30. //    Perspective. New York, NY: John Wiley & Sons.
  31. //
  32. //  It may be freely copied, redistributed, and/or modified
  33. //  for personal use ONLY, as long as the copyright notice
  34. //  is included with all source code files.
  35. //
  36. ////////////////////////////////////////////////////////////
  37.  
  38. #include "win_sbar.h"
  39.  
  40. // Set scroll bar positions and ranges
  41. void WinScroll::Set( int width, int height )
  42. {
  43.   RECT rect;
  44.  
  45.   GetClientRect(hwnd, &rect);
  46.   size.x = rect.right;
  47.   size.y = rect.bottom;
  48.  
  49.   max_range.x = max(0, width - size.x);
  50.   curr_pos.x = min(curr_pos.x, max_range.x);
  51.  
  52.   SetScrollRange(hwnd, SB_HORZ, 0, max_range.x, FALSE);
  53.   SetScrollPos(hwnd, SB_HORZ, curr_pos.x, TRUE);
  54.  
  55.   max_range.y = max(0, height - size.y);
  56.   curr_pos.y = min(curr_pos.y, max_range.y);
  57.  
  58.   SetScrollRange(hwnd, SB_VERT, 0, max_range.y, FALSE);
  59.   SetScrollPos(hwnd, SB_VERT, curr_pos.y, TRUE);
  60. }
  61.  
  62. // Initialize scroll bar positions and ranges
  63. void WinScroll::Init( int width, int height )
  64. {
  65.   curr_pos.x = curr_pos.y = 0;
  66.   Set(width, height);
  67. }
  68.  
  69. void WinScroll::Hide()  // Hide scroll bars
  70. {
  71.   SetScrollRange(hwnd, SB_HORZ, 0, 0, TRUE);
  72.   SetScrollRange(hwnd, SB_VERT, 0, 0, TRUE);
  73. }
  74.  
  75. // Process vertical scroll bar message
  76. void WinScroll::Vert( WPARAM sb_code, WORD sb_pos )
  77. {
  78.   switch (sb_code)
  79.   {
  80.     case SB_LINEUP:
  81.       inc.y = -1;
  82.       break;
  83.     case SB_LINEDOWN:
  84.       inc.y = 1;
  85.       break;
  86.     case SB_PAGEUP:
  87.       inc.y = min(-1, -size.y >> 2);
  88.       break;
  89.     case SB_PAGEDOWN:
  90.       inc.y = max(1, size.y >> 2);
  91.       break;
  92.     case SB_TOP:
  93.       inc.y = -inc.y;
  94.       break;
  95.     case SB_BOTTOM:
  96.       inc.y = max_range.y - curr_pos.y;
  97.       break;
  98.     case SB_THUMBPOSITION:
  99.       inc.y = sb_pos - curr_pos.y;
  100.       break;
  101.     default:
  102.       inc.y = 0;
  103.   }
  104.  
  105.   if ((inc.y = max(-curr_pos.y, min(inc.y, max_range.y -
  106.       curr_pos.y))) != 0)
  107.   {
  108.     curr_pos.y += inc.y;
  109.     ScrollWindow(hwnd, 0, -inc.y, NULL, NULL);
  110.     SetScrollPos(hwnd, SB_VERT, curr_pos.y, TRUE);
  111.     UpdateWindow(hwnd);
  112.   }
  113. }
  114.  
  115. // Process horizontal scroll bar message
  116. void WinScroll::Horz( WPARAM sb_code, WORD sb_pos )
  117. {
  118.   switch (sb_code)
  119.   {
  120.     case SB_LINEUP:
  121.       inc.x = -1;
  122.       break;
  123.     case SB_LINEDOWN:
  124.       inc.x = 1;
  125.       break;
  126.     case SB_PAGEUP:
  127.       inc.x = min(-1, -size.x >> 2);
  128.       break;
  129.     case SB_PAGEDOWN:
  130.       inc.x = max(1, size.x >> 2);
  131.       break;
  132.     case SB_THUMBPOSITION:
  133.       inc.x = sb_pos - curr_pos.x;
  134.       break;
  135.     default:
  136.       inc.x = 0;
  137.   }
  138.  
  139.   if ((inc.x = max(-curr_pos.x, min(inc.x, max_range.x -
  140.       curr_pos.x))) != 0)
  141.   {
  142.     curr_pos.x += inc.x;
  143.     ScrollWindow(hwnd, -inc.x, 0, NULL, NULL);
  144.     SetScrollPos(hwnd, SB_HORZ, curr_pos.x, TRUE);
  145.     UpdateWindow(hwnd);
  146.   }
  147. }
  148.  
  149.